import jwt
from rest_framework.authentication import BaseAuthentication, TokenAuthentication
from rest_framework.exceptions import AuthenticationFailed

from user.models import User
from utils.jwttool import tool


class MyAuthorization(BaseAuthentication):
    def authenticate(self, request):
        # 编写认证逻辑
        # 解析token的逻辑  在解析的过程中可能会遇到异常，给抛出就行
        # 1. 获取到token 前端会在请求头中携带token  我们获取请求的数据在drf中有两种方式
        mytoken = request.META.get('HTTP_AUTHORIZATION','')
        # 2. 判断token是否存在，不存在则抛出异常
        if not mytoken:
            raise AuthenticationFailed('没有token')
        # 3. 解析token，获取用户信息
        try:
            payload = tool.parsejwt(mytoken)# 解析token过程中可能会抛出异常
            info= User.objects.filter(id=payload['id']).first()
            if not info:
                raise AuthenticationFailed('用户不存在')
            return (info.id,None)
        except jwt.InvalidTokenError:
            raise AuthenticationFailed('token无效')
        except jwt.ExpiredSignatureError:
            raise AuthenticationFailed('token过期')




